
/**
 * 
 * @param {*} fn 这里的*是任何执行的函数
 * @param  {...any} args 
 * @returns 
 */
function myNew (fn, ...args) {
  // 创建一个空对象 obj
  let obj = {};
  // 将新创建的对象的原型设置为构造函数的 prototype 属性
  Object.setPrototypeOf(obj, fn.prototype);
  // 使用 apply 方法调用构造函数 fn，并将 obj 作为 this 绑定的对象，
  // 同时传入剩余参数 args 作为构造函数的参数列表
  let result = fn.apply(obj, args);
  // 如果构造函数返回的结果是对象，则返回这个对象；否则返回新创建的对象 obj
  return result instanceof Object ? result : obj;
}

function Person (name, age) {
  this.name = name;
  this.age = age;
}
// test 
const Person1 = myNew(Person, 'lily', 30)
console.log(Person1.name);
